﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace demo.Tool
{
    public static class DataTableToEntity<T> where T : new()
    {


        /// <summary>
        /// 单行datatable数据转换为对象：
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="rowindex"></param>
        /// <param name="isStoreDB"></param>
        /// <returns></returns>
        public static T TableToEntity(DataTable dt, int rowindex = 0, bool isStoreDB = true)
        {
            Type type = typeof(T);
            T entity = Activator.CreateInstance<T>();
            if (dt == null)
            {
                return entity;
            }
            DataRow row = dt.Rows[rowindex];
            PropertyInfo[] pArray = type.GetProperties();
            foreach (PropertyInfo p in pArray)
            {
                if (!dt.Columns.Contains(p.Name) || row[p.Name] == null || row[p.Name] == DBNull.Value)
                {
                    continue;
                }
                if (isStoreDB && p.PropertyType == typeof(DateTime) && Convert.ToDateTime(row[p.Name]) < Convert.ToDateTime("1753-01-02"))
                {
                    continue;
                }
                try
                {
                    var obj = Convert.ChangeType(row[p.Name], p.PropertyType);
                    p.SetValue(entity, obj, null);
                }
                catch (Exception)
                {

                }
            }
            return entity;
        }


        /// <summary>
        /// 多行datatable数据转换为对象：
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> TableToList(DataTable dt)
        {
            List<T> listT = new List<T>();

            Type type = typeof(T);

            if (dt == null)
            {
                return listT;
            }
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    T entity = Activator.CreateInstance<T>();

                    DataRow row = dt.Rows[i];

                    PropertyInfo[] pArray = type.GetProperties();

                    foreach (PropertyInfo p in pArray)
                    {
                        if (!dt.Columns.Contains(p.Name) || row[p.Name] == null || row[p.Name] == DBNull.Value)
                        {
                            continue;
                        }

                        if (p.PropertyType == typeof(DateTime) && Convert.ToDateTime(row[p.Name]) < Convert.ToDateTime("1753-01-02"))
                        {
                            continue;
                        }
                        try
                        {
                            var obj = Convert.ChangeType(row[p.Name], p.PropertyType);
                            p.SetValue(entity, obj, null);
                        }
                        catch (Exception)
                        {
                            // throw;
                        }
                    }
                    listT.Add(entity);

                }
            }
            return listT;
        }

    }
}
